package com.wgy.day30.FileFilter文件过滤器;

import java.io.File;

/*
FileFilter文件过滤器:
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFiles(FileFilter filter):
File[] listFiles(FilenameFilter filter):

java.io.FileFilter接口:用于抽象路径名(File对象)的过滤
                  作用:用来过滤文件(File对象)
                  原理:通过覆盖接口中的抽象方法accept来定义过滤的规则
               抽象方法:boolean accept(File pathname):测试抽象路径名是否应该包含在某个路径列表中
                       参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
                       返回值:是一个布尔值
                             true:就会把传递过去的File对象保存到File数组中
                             false:就不会把传递过去的File对象保存到File数组中

java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
                      作用:用于过滤文件的名称
                      原理:通过覆盖接口中的抽象方法accept来定义过滤的规则
                   抽象方法:boolean accept(File dir,String name):测试指定文件是否应该包含在某一个文件列表中
                           参数:File dir:构造方法中传递的被遍历的目录
                               String name:使用listFiles方法遍历目录,获取的每一个文件/文件夹的名称

注意:这两个过滤器接口都是没有实现类的,需要我们自己写实现类,覆盖重写过滤的方法accept,在方法中自己定义过滤的规则

*/
public class Demo01FileFilter {
    public static void main(String[] args) {
        File f1 = new File("D:\\小云\\abc");

        getAllFile(f1);

    }

    public static void getAllFile(File dir) {

        System.out.println(dir);
        //将指定过滤的文件对象存储到File数组中  传递过滤器对象
        File[] list = dir.listFiles( new FileFilterImpl());
 /*
    listFiles方法一共做了3件事情:
        1.listFiles方法会对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹,封装为File对象
        2.listFiles方法会调用参数传递过来的过滤器中的accept方法
        3.listFiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname

     accept方法得到listFiles方法传递过来的File对象,返回一个布尔值
      true: 就会把传递过去的File对象保存到File数组中
      false:就不会把传递过去的File对象保存到File数组中
*/
        //对遍历得到的File对象f进行判断,判断是否是文件夹
        for (File f : list) {
            //如果是文件夹,就继续遍历这个文件夹
            //getAllFile()方法参数传递的就是文件夹,是遍历文件夹的方法
            //所以直接调用getAllFile方法即可:递归(自己调用自己)
            if (f.isDirectory()) {
                getAllFile(f);
            } else {
                System.out.println(f);
            }
        }
    }
}
